<!doctype html>
<html lang=ru id=faq>

<!-- If you make edits to any FAQ documents, please start each sentence
     on a new line, and try to keep the general formatting consistent
     with the rest of the pages -->

<title>OpenBSD FAQ: Работа с пакетами</title>
<meta charset=utf-8>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="../openbsd.css">
<link rel="canonical" href="https://www.openbsd.org/faq/faq15.html">

<!--
Copyright (c) 2005-2009 Steven Mestdagh <steven@openbsd.org>

Permission to use, copy, modify, and distribute this documentation for
any purpose with or without fee is hereby granted, provided that the
above copyright notice and this permission notice appear in all copies.

THE DOCUMENTATION IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
WARRANTIES WITH REGARD TO THIS DOCUMENTATION INCLUDING ALL IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS DOCUMENTATION
-->

<h2 id=OpenBSD>
<a href="../index.html">
<i>Open</i><b>BSD</b></a>
FAQ - Работа с пакетами
<small>
<a href="index.html">[FAQ - На главную]</a>
</small>
</h2>
<hr>

<ul>
  <li><a href="#Intro"        >Введение</a>
  <li><a href="#Mirror"       >Выбор зеркала</a>
  <li><a href="#PkgFind"      >Поиск пакетов</a>
  <li><a href="#PkgInstall"   >Установка пакетов</a>
  <li><a href="#PkgUpdate"    >Обновление пакетов</a>
  <li><a href="#PkgRemove"    >Удаление пакетов</a>
  <li><a href="#PkgDup"       >Дублирование установленных
		               пакетов на другую машину</a>
  <li><a href="#PkgPartial"   >Незаконченная установка или
		               удаление пакета</a>
</ul>

<hr>

<h2 id="Intro">Введение</h2>

Существует множество программ, которые без проблем можно запустить в
OpenBSD. Для того, чтобы их можно было легко устанавливать и работать
с ними, их необходимо <i>портировать</i> на OpenBSD и упаковать.
Целью создания системы пакетов является возможность отслеживания того,
какой софт уже установлен, а также возможность его быстрого обновления
или удаления.
За считаные минуты можно скачать и установить необходимое количество
пакетов, при этом все будет размещено в нужном месте.

<p>
Коллекция портов <b>не проходит</b> столь тщательного аудита безопасности
как сама OpenBSD. Тем не менее, мы все же мы стремимся сохранять качество
нашей коллекции пакетов на достаточном уровне, хотя и не имеем такого
количества людей, чтобы гарантировать такой же уровень стабильности и
безопасности.

<p>
Команда разработчиков, занимающаяся портми OpenBSD, сосредоточена на создании
пакетов, а не работе с самими портами. Другими словами, вам рекомендуется
использовать пакеты вместо того, чтобы устанавливать (собирать) программы
из портов. Обновления безопасности
<a href="https://openbsd.org/faq/ports/ports.html#PortsSecurity">
являются исключением из этого правила</a>,
поскольку они доступны только через порты.
<b>Пакеты с бинарниками для -release и -stable не обновляются</b>.

<p>
Работать с пакетами можно при помощи следующих утилит:

<ul>
  <li><a href="https://man.openbsd.org/pkg_add">pkg_add(1)</a>
  - для установки и обновлении пакетов
  <li><a href="https://man.openbsd.org/pkg_check">pkg_check(8)</a>
  - для проверки целостности установленных пакетов
  <li><a href="https://man.openbsd.org/pkg_delete">pkg_delete(1)</a>
  - для удаления установленных пакетов
  <li><a href="https://man.openbsd.org/pkg_info">pkg_info(1)</a>
  - предоставляет информацию о пакетах
</ul>

Допустим, для корректного запуска приложения X требуется наличие приложений
Y и Z. Приложение X говорит о своей зависимости от этих приложений, именно
по этому Y и Z называют <i>зависимостями</i> X. Y может требовать наличия P
и Q, а Z, в свою очередь, для корректной работы наличие R. Таким образом
формируется дерево зависимостей.

<p>
Пакеты выглядят как и самые обычные <tt>.tgz</tt> архивы. Но есть одно очень
важное отличие: пакет содержит дополнительную <i>информацию для распаковки</i>.
Эта информация используется
<a href="https://man.openbsd.org/pkg_add">pkg_add(1)</a> для следующих целей:

<ul>
  <li>Различных проверок: не установлен ли этот пакет или не конфликтует ли
      он с уже установленными пакетами или существующими в системе файлами?

  <li>Зависимости, необходимые для установки пакета, будут автоматически
      загружены и установлены прежде, чем продолжится его установка.

  <li>Информация о новом пакете будет добавленна в базу данных (central
      repository), которая находится в <tt>/var/db/pkg/</tt>. Это гарантия
      того, что зависимости не будут удалены раньше, чем пакет, который в них
      нуждается. Другими словами, никакая программа не будет случайно сломана
      неосторожными действиями пользователя.
</ul>

<h2 id="Mirror">Выбор зеркала</h2>

Два места, которые проверяет <a href="https://man.openbsd.org/pkg_add">pkg_add(1)</a>
при поиске пакетов, это файл
<a href="https://man.openbsd.org/installurl">installurl(5)</a>
(<code>/etc/installurl</code>) и значение переменной окружения <code>PKG_PATH</code>.
Предпочтительным является первый метод и именно он настроен по умолчанию после
установки системы.

<p>
Если необходимо настроить несколько зеркал одновременно, <code>PKG_PATH</code> поймет
это, если передать ему список, разделенный двоеточиями.

<pre class="cmdbox">
# <b>export PKG_PATH=scp://user@company-build-server/usr/ports/packages/%a/all:https://trusted-public-server/%m:installpath</b>
</pre>

И хотя настроенная по умолчанию система должна отлично работать и устраивать
большинство пользователей, на <a href="https://openbsd.org/ftp.html">странице зеркал</a>
можно найти список альтернативных репозиторий.

<h2 id="PkgFind">Поиск пакетов</h2>

Большая коллекция скомпилированных пакетов доступна для наиболее
распространенных архитектур.

<p>
Чтобы найти необходимый пакет, используейте 
<a href="https://man.openbsd.org/pkg_info">pkg_info(1)</a> с параметром
<code>-Q</code>.

<pre class="cmdbox">
$ <b>pkg_info -Q unzip</b>
lunzip-1.8
unzip-6.0p9
unzip-6.0p9-iconv
</pre>

Другим способом поиска является использование команды <code>pkglocate</code>,
доступной после установки пакета <code>pkglocatedb</code>.

<pre class="cmdbox">
$ <b>pkglocate mutool</b>
mupdf-1.11p1-js:textproc/mupdf,js:/usr/local/bin/mutool
mupdf-1.11p1-js:textproc/mupdf,js:/usr/local/man/man1/mutool.1
mupdf-1.11p1:textproc/mupdf:/usr/local/bin/mutool
mupdf-1.11p1:textproc/mupdf:/usr/local/man/man1/mutool.1
</pre>

Если нужно найти какой-то конкретный файл, то этот метод поможет найти
называние пакета, который этот файл содержит.

<p>
Как вы видете, некоторые пакеты доступны в нескольких различных вариантах.
Так называемых <b>»flavors«</b>. В главе,
<a href="https://openbsd.org/faq/ports/ports.html#PortsFlavors">посвященной портам</a>,
рассказывается об этом подробнее, но если в двух словах, то это просто
различные конфигурации одного и того же пакета.
Например, пакет может быть сконфигурирован с поддержкой базы данных, или
сконфигурирован так, чтобы не быть зависимым от X11 и работать без него,
и т.д. Некоторые пакеты разделены на так называемые <b>»subpackages«</b>,
которы могут быть установленны отдельно.

<p>
Не все собранные пакеты доступны на наших серверах и их зеркалах.
Некоторые просто не работают на всех архитектурах.
Некоторые не могут распростаняться из-за проблем с лицензией.

<h2 id="PkgInstall">Установка пакетов</h2>

Для установки пакетов используется утилита
<a href="https://man.openbsd.org/pkg_add">pkg_add(1)</a>.
Если пакет предлагает несколько »flavors«, надо будет выбрать какой именно
должен быть установлен.

<pre class="cmdbox">
# <b>pkg_add rsync</b>
Ambiguous: choose package for rsync
a       0: &lt;None&gt;
        1: rsync-3.1.2p0
        2: rsync-3.1.2p0-iconv
Your choice:
</pre>

В этом примере надо будет выбрать <b>1</b>, если вы хотите установить пакет
со стандартной конфигурацией или <b>2</b>, если вам нужна поддежка iconv.
Если вы знаете заранее о доступных »flavors«, можно сразу указать в консоли
какой из них нужно установить
<code>pkg_add rsync--</code> (стандартная кофигурация) или
<code>pkg_add rsync--iconv</code> (с поддержкой iconv).

<p>
Можно сразу указать в одной строке список имен пакетов, которые затем будут
по очереди установленны вместе с зависимостями.
Можно так же указать путь к пакету, который надо установить, будь это локальный
файл или адрес URL. Поддерживаемыми URL являются http, https, ftp и scp.

<p>
Для некоторых пакетов в процессе установки предоставляется дополнительная
информация, касательно его конфигурации или специфики запуска.

<pre class="cmdbox">
# <b>pkg_add jove</b>
jove-4.16.0.73p0: ok
--- +jove-4.16.0.73p0 -------------------
See /usr/local/share/jove/README about changes to /etc/rc or
/etc/rc.local so that the system recovers jove files
on reboot after a system crash
</pre>

В дополнение к этому, некоторые пакеты предоставляют дополнительную информацию
в файле <code>/usr/local/share/doc/pkg-readmes</code>.

<p>
Для надежности, если вы устанавливаете пакет, который уже устанавливали ранее
и удалили, конфигурационные файлы, которые были изменены, не будут перезаписаны.
Это относится и к обновлению пакетов.

<p>
Иногда вы можете столкнуться с ошибкой как в этом примере:

<pre class="cmdbox">
# <b>pkg_add xv</b>
quirks-2.367 signed on 2017-10-03T11:21:28Z
xv-3.10ap4:jpeg-6bp3: ok
xv-3.10ap4:png-1.2.14p0: ok
xv-3.10ap4:tiff-3.8.2p0: ok
Can't install xv-3.10ap15 because of libraries
|library X11.16.1 not found
| not found anywhere
Direct dependencies for xv-3.10ap15 resolve to png-1.6.31 jasper-1.900.1p5 tiff-4.0.8p1 jpeg-1.5.1p0v0
Full dependency tree is png-1.6.31 tiff-4.0.8p1 jasper-1.900.1p5 jpeg-1.5.1p0v0
</pre>

Пакет содержит информацию о своих зависимостях (библиотеках), которые
должны быть установлены. Если одна из необходимых библиотек не может
быть найдена, пакет не будет устанавливаться, поскольку без этой
библиотеки он все равно не будет работать.

<p>
Что можно проверить:

<ul>
    <li>Система установленна не полностью: вы не установили файл, содержащий
        данную библиотеку. Просто
        <a href="faq4.html#FilesNeeded">добавьте файл</a>, содержащий необходимую
        библиотеку.
    <li>Ваша система (или пакет) устарели: у вас слишком старая версия необходимой
        библиотеки. Удостовертесь, что и система и устанавливаемый в ней пакет,
	последней версии.
    <li>Если вы используете -current, снапшот базовой части системы и пакет могут
	быть не синхронизованы. Подождите, пока зеркала не синхронизируются, и
	попробуйте снова.
</ul>

<h2 id="PkgUpdate">Обновление пакетов</h2>

Предположим, у вас была старая версия unzip, установленная ещё до
обновления OpenBSD. В этом случае обновить пакет до последней доступной версии
можно вот так:

<pre class="cmdbox">
# <b>pkg_add -u unzip</b>
unzip-5.52->unzip-5.52p0: ok
Read shared items: ok
</pre>

Если у пакета есть зависимости, они так же проверяются на наличие обновлений.
При запуске <a href="https://man.openbsd.org/pkg_add">pkg_add(1)</a> с параметром
<code>-u</code> будут обновлены все установленные пакеты. Настоятельно
рекомендуется обновляться именно так, нежели обновлять каждый пакет по отдельности.

<h2 id="PkgRemove">Удаление пакетов</h2>

Чтобы удалить пакет, просто используйте его имя как агрумент при запуске
<a href="https://man.openbsd.org/pkg_delete">pkg_delete(1)</a>.

<pre class="cmdbox">
# <b>pkg_delete screen</b>
screen-4.0.3p6: ok
Read shared items: ok
</pre>

Как уже говорилось, измененные конфигурационные файлы не будут удалены.
От ненужных зависимостей в любое время можно избавиться командой
<code>pkg_delete -a</code>.

<h2 id="PkgDup">Дублирование установленных пакетов на другую машину</h2>

Установка новой системы OpenBSD с таким же набором программ, что и на старой
системе, достаточно частое явление.
Параметры <code>-mz</code> для
<a href="https://man.openbsd.org/pkg_info">pkg_info(1)</a> помогут нам в этом.

<ul>
  <li>Параметр <code>-m</code> выберет только те пакеты, которые были
      установленны вручную. Список зависимостей отдельно не сохраняется,
      т.к. в этом нет необходимости, потому что при установке пакетов они
      будут установленны автоматически.
  <li>Параметр <code>-z</code> игнорирует версию установленных пакетов.
      Будет использована информация только о flavor и branch, что гарантирует
      что при будущих установках пакета будет выбрана соответствующая версия.
</ul>

Например:

<pre class="cmdbox">
$ <b>pkg_info -mz | tee list</b>
abcde--
mpv--
python--%3.6
vim--no_x11
</pre>

Скопирует список файлов. После чего этот список используется на другой машине:

<pre class="cmdbox">
# <b>pkg_add -l list</b>
</pre>

Спецификация каждого пакета содержит flavor (<code>--</code> соответствует
стандартной конфигурации) добавленное к его имени, а так же пакеты, которые
доступны в нескольких версиях, так же содержат branch информацию.
В данном случае, 
<a href="https://man.openbsd.org/pkg_add">pkg_add(1)</a> выберет доступную
в новом репозитории версию пакета python, но сам интерпретор будет версии
<code>3.6</code>, т.к. эта информация о branch и она учитывается.

<h2 id="PkgPartial">Незаконченная установка или удаление пакета</h2>

В очень редких случаях вы можете обнаружить, что пакет не был полностью
установлен из-за конфликта с другими файлами. Неполная установка
обычно помечается добавлением »partial-« в название пакета. Это может
произойти, например, если вы случайно нажмете CTRL+C в процессе установки.
Установка может быть продолжена позднее, и "partial-*" пакет исчезнет,
или его можно удалить при помощи
<a href="https://man.openbsd.org/pkg_delete">pkg_delete(8)</a>.
<p>
Более серьезные сбои, такие как проблемы с файловой системой, могут
привести к повреждению <code>/var/db/pkg</code>.
<p>
Утилита <a href="https://man.openbsd.org/pkg_check">pkg_check(8)</a>
может проверить состояние установленных пакетов.
